#
 # 	my_string_library.c
 #
 #  Author      : 84236   90110   90131
#

#include <mips/regdef.h>
#include <sys/syscall.h>
#define SSIZE_MY_STR	(32)
#define	O_MY_STR_RA		(28)
#define	O_MY_STR_FP		(24)
#define	O_MY_STR_GP		(20)
#define O_MY_STR_ARG0	0
#define O_MY_STR_ARG1	4

			.text
			.align 	2
			.globl	my_strlen
			.ent	my_strlen
my_strlen:
			.frame $fp,SSIZE_MY_STR,ra
   			.set  noreorder
   			.cpload  t9
   			.set  reorder
   			subu	sp,sp,SSIZE_MY_STR	# creo stack frame
			sw		gp,O_MY_STR_GP(sp)
			sw		$fp,O_MY_STR_FP(sp)
			sw		ra,O_MY_STR_RA(sp)
			move	$fp,sp
			sw		a0,O_MY_STR_ARG0($fp)

# t0 : indice y contador
# t1 : caracter leído

			li		t0,0 				# indice = 0

loopLectura:
			lb		t1,0(a0)			# t1 <- caracater leido
			bne 	t1,zero,incrementarContador	# si no llegue a fin de arhivo incremento contador
			b		finLoopLectura		# salto a finLoopLectura

incrementarContador:
			addiu	t0,t0,1				# incremento contador
			addiu	a0,a0,1				# incremento posicion de lectura
			b		loopLectura			# salto a loopLectura

finLoopLectura:
			addu	v0,t0,zero			# v0 = contador

fin_my_strlen:
			move	sp,$fp				# destruyo stack frame
			lw		gp,O_MY_STR_GP(sp)
			lw		$fp,O_MY_STR_FP(sp)
			lw		ra,O_MY_STR_RA(sp)
			addiu	sp,sp,SSIZE_MY_STR
			jr		ra
			.end	my_strlen

			.align 	2
			.globl	my_strcmp
			.ent	my_strcmp

my_strcmp:
			.frame $fp,SSIZE_MY_STR,ra
   			.set  noreorder
   			.cpload  t9
   			.set  reorder
   			subu	sp,sp,SSIZE_MY_STR	# creo stack frame
			sw		gp,O_MY_STR_GP(sp)
			sw		$fp,O_MY_STR_FP(sp)
			sw		ra,O_MY_STR_RA(sp)
			move	$fp,sp
			sw		a0,O_MY_STR_ARG0($fp)
			sw		a1,O_MY_STR_ARG1($fp)

# t0 : caracter leido de str1
# t1 : caracter leído de str2

loop:
			lb		t0,0(a0)
			lb		t1,0(a1)			# t1 <- caracater leido
			subu 	v0,t0,t1			# v0 = t0 - t1
			beq 	t0,zero,fin_my_strcmp	# si t0=0 salto a fin_my_strcmp
			beq 	t1,zero,fin_my_strcmp	# si t1=0 salto a fin_my_strcmp
			addiu	a0,a0,1				# incremento posicion de lectura de str1
			addiu	a1,a1,1				# incremento posicion de lectura de str2
			beq		v0,zero,loop		# si ambos caracteres son iguales vuelvo al loop

fin_my_strcmp:
			move	sp,$fp				# destruyo stack frame
			lw		gp,O_MY_STR_GP(sp)
			lw		$fp,O_MY_STR_FP(sp)
			lw		ra,O_MY_STR_RA(sp)
			addiu	sp,sp,SSIZE_MY_STR
			jr		ra
			.end	my_strcmp
